package kevin.hbase.util;

import lombok.extern.slf4j.Slf4j;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.io.File;
import java.security.GeneralSecurityException;
import java.security.Security;
import java.util.Date;
import java.util.Properties;

/**
 * 邮件发送工具类
 * 使用网易邮箱
 * 163 、 126 、 yeah 的普通邮箱：一封邮件最多发送给 40 个收件人 , 每天发送限额为 50 封。
 * 163VIP邮箱：每天发送限额为 800 封邮件。
 * 企业邮箱：单个用户每天发送限额为 1000 封邮件，一封邮件最多包含 500 个收件人邮箱地址。
 * <p>
 * 专门创建了一个网易普通邮箱
 * 邮箱账号：seggps001@163.com
 * 邮箱密码：seggps123
 * 邮箱授权码：seggps123456
 * 绑定手机号：17673458241
 * by 陈畅林
 *
 * @author chenchanglin 2019-7-18
 */
@Slf4j
public class EmailUtil {

    /**
     * 发件人邮箱账号
     */
    private final static String MAIL_FROM_USERNAME = "seggps001@163.com";

    /**
     * 发件人邮箱密码或授权码
     */
    private final static String MAIL_FROM_PASSWORD = "seggps123456";


    /**
     * 发送邮件
     *
     * @param toUser  收件人 多个使用,分隔
     * @param title   标题
     * @param content 内容
     */
    public static void sendMail(String toUser, String title, String content) throws Exception {

        Properties props = System.getProperties();
        props.setProperty("mail.smtp.host", "smtp.163.com");
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.port", "465");
        props.setProperty("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.auth", "true");

        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(MAIL_FROM_USERNAME, MAIL_FROM_PASSWORD);
            }
        });

        Message msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(MAIL_FROM_USERNAME));
        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toUser, false));
        msg.setSubject(title);
        msg.setText(content);
        msg.setSentDate(new Date());

        // send Email
        Transport.send(msg);
    }

    public static void sendMail(String mailTo, String title, String content, String attachmentPath, String attachmentName) throws GeneralSecurityException {
        // 获取系统属性
        Properties props = System.getProperties();
        // 设置邮件服务器
        props.setProperty("mail.smtp.host", "smtp.163.com");
        //发送邮件协议
        props.setProperty("mail.transport.protocol", "SMTP");
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.port", "465");
        props.setProperty("mail.smtp.socketFactory.port", "465");
        // 设置邮件服务器是否需要登录认证
        props.put("mail.smtp.auth", "true");

        // 验证账号及密码，密码需要是第三方授权码
        Authenticator auth = new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(MAIL_FROM_USERNAME, MAIL_FROM_PASSWORD);
            }
        };

        // 获取默认session对象
        Session session = Session.getInstance(props, auth);

        try {
            // 创建默认的 MimeMessage 对象
            MimeMessage message = new MimeMessage(session);

            // Set From: 头部头字段
            message.setFrom(new InternetAddress(MAIL_FROM_USERNAME));

            // Set To: 邮件接收人
            //message.addRecipient(Message.RecipientType.TO, new InternetAddress(mailTo));
            // Set To: 邮件接收人，多个接收人，用逗号分隔
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(mailTo, false));

            // Set Subject: 主题名称
            message.setSubject(title);

            message.setSentDate(new Date());

            // 创建消息部分
            BodyPart messageBodyPart = new MimeBodyPart();

            // 消息内容
            messageBodyPart.setText(content);

            // 创建多重消息
            Multipart multipart = new MimeMultipart();

            // 设置文本消息部分
            multipart.addBodyPart(messageBodyPart);

            // 附件部分
            messageBodyPart = new MimeBodyPart();

            //把文件，添加到附件1中
            //数据源
            DataSource source = new FileDataSource(new File(attachmentPath));
            //设置第一个附件的数据
            messageBodyPart.setDataHandler(new DataHandler(source));
            //设置附件的文件名
            messageBodyPart.setFileName(attachmentName);
            multipart.addBodyPart(messageBodyPart);
            message.setContent(multipart);

            // 发送消息
            Transport.send(message);
        } catch (MessagingException e) {
            log.error(e.getMessage(), e);
        }
    }

    public static void qqMail() throws GeneralSecurityException {
        // 收件人电子邮箱
        String to = "XXXXXXXXX@qq.com";    //也可以的

        // 发件人电子邮箱
        String from = "XXXXXXXXX@qq.com";

        // 获取系统属性
        Properties properties = new Properties();

        //发送邮件协议
        properties.setProperty("mail.transport.protocol", "SMTP");

        // 设置邮件服务器
        properties.setProperty("mail.host", "smtp.qq.com");

        // 设置邮件服务器端口
        properties.setProperty("mail.smtp.socketFactory.port", "587");

        //如果是阿里云服务器
        properties.put("mail.smtp.port", "587");

        // 设置邮件服务器是否需要登录认证
        properties.setProperty("mail.smtp.auth", "true");


        // 验证账号及密码，密码需要是第三方授权码
        Authenticator auth = new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("XXXXXXXXX@qq.com", "urzgdvdyflesbjhh");
            }
        };

        // 获取默认session对象
        Session session = Session.getInstance(properties, auth);

        try {
            // 创建默认的 MimeMessage 对象
            MimeMessage message = new MimeMessage(session);

            // Set From: 头部头字段
            message.setFrom(new InternetAddress(from));

            // Set To: 邮件接收人
            message.addRecipient(Message.RecipientType.TO,
                    new InternetAddress(to));

            // Set Subject: 主题名称
            message.setSubject("This is the Subject Line!");

            // 创建消息部分
            BodyPart messageBodyPart = new MimeBodyPart();

            // 消息内容
            messageBodyPart.setText("TEST/TEST");

            // 创建多重消息
            Multipart multipart = new MimeMultipart();

            // 设置文本消息部分
            multipart.addBodyPart(messageBodyPart);

            // 附件部分
            messageBodyPart = new MimeBodyPart();

            //把文件，添加到附件1中
            //数据源
            DataSource source = new FileDataSource(new File("D:/1.pptx"));
            //设置第一个附件的数据
            messageBodyPart.setDataHandler(new DataHandler(source));
            //设置附件的文件名
            messageBodyPart.setFileName("1.pptx");
            multipart.addBodyPart(messageBodyPart);
            message.setContent(multipart);

            // 发送消息
            Transport.send(message);
            System.out.println("Sent message successfully....");
        } catch (MessagingException mex) {
            mex.printStackTrace();
        }
    }


    public static void main(String[] args) throws Exception {
        //EmailUtil.sendMail("1250083916@qq.com", "平台在线率过低！", "马上检查！");

        EmailUtil.sendMail("zhanggang@kauto.com","6月24日飞点分析报告","6月24日飞点分析报告，请查收！","j:\\flypoint_report_0624.xlsx","flypoint_report_0624.xlsx");
    }


}